package com.springboot.jdk.nio;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * FileChannel 独占锁 Lock 案例
 *
 * @author: zr
 * @date: 2021-10-19
 */
public class FileChannelRandomAccessFileShareLockDemo3 {

    public static void main(String[] args) throws IOException, InterruptedException {
        String path = "F:\\develop\\channel\\hello1.txt";

        RandomAccessFile accessFile = new RandomAccessFile(path, "rw");

        FileChannel channel = accessFile.getChannel();

        // true 表示加了一把共享锁
        // false 表示加了一把独占锁
        channel.lock(0, Integer.MAX_VALUE, false);
        System.out.println("加锁成功");

        // 1、加独占锁之后，写数据
        // 构建一个 ByteBuffer 缓冲区
        ByteBuffer wrap = ByteBuffer.wrap("china".getBytes());

        // 通过channel将 Buffer 里面的数据写入到磁盘文件里面
        channel.write(wrap);

        // 2、加独占锁之后读取数据
        // ByteBuffer buffer = ByteBuffer.allocateDirect(11);
        // channel.read(buffer);
        // buffer.flip();
        //
        // byte[] bytes = new byte[11];
        // buffer.get(bytes);
        //
        // System.out.println("添加共享锁之后，读取数据成功：" + new String(bytes));

        channel.close();
        accessFile.close();
    }
}
